6장. 자료 찾아 붙이고, 스스로 일하기 (RAG와 에이전트)
출처: 『AI 엔지니어링』(Chip Huyen 지음) | 원서: AI Engineering (O'Reilly) — 본 입문판은 PDF 원문에서 직접 풀어 썼다.
코드는 분위기만 — Python·함수 이름 같은 건 몰라도 됩니다. '비유'와 '위험'만 봐도 충분해요.
0. 이 장의 새 단어 (0장에 없는 것만 3개)
이 셋만 알면 6장은 다 읽힌다.
나머지 어려운 말(임베딩·RAG·환각 등)은 0장 용어집에 있다.
청크(chunk)
한 문장 뜻 — 긴 문서를 검색하기 좋게 잘라 놓은 한 조각.
일상비유 — 두꺼운 책을 통째로 복사하는 대신, 필요한 쪽만 뜯어 두는 것. 한 쪽이 곧 청크다.
한 줄 예 —
# 아래 예제는 핵심 흐름만 짧게 보여 줍니다.
# 긴 문서를 작은 조각으로 자름
chunks = split("계약서 전문...", size=500) # 500자씩 한 조각
에이전트(agent)
한 문장 뜻 — 주변을 살펴보고(읽기) 직접 행동까지(쓰기) 하는 AI. 모델에 손발을 달아 준 것.
일상비유 — 시키면 알아서 일하는 비서. 검색도 하고, 계산기도 두드리고, 메일도 보낸다. 그냥 답만 하는 챗봇과 다르다.
한 줄 예 —
# 그냥 답하는 게 아니라, 도구를 골라 행동까지 함
# 준비한 흐름에 실제 입력을 넣어 결과를 확인합니다.
agent.run("이번 주 환율로 40파운드를 킬로로 바꿔줘")
도구(tool)
한 문장 뜻 — 에이전트가 부려 쓰는 외부 기능. 검색기·계산기·메일 보내기 같은 것.
일상비유 — 비서 책상 위의 연장통. 계산기, 전화기, 메모장. 연장이 많을수록 더 많은 일을 한다.
한 줄 예 —
# 모델은 수학에 약함 → 계산기 도구를 쥐여 줌
# `tools`에 중간 결과를 담아 다음 줄에서 재사용합니다.
tools = [calculator, web_search, send_email]
이런 적 있죠?
AI한테 "우리 회사 환불 규정 알려줘"라고 물었다.
그런데 AI는 우리 회사를 모른다. 학습할 때 본 적이 없으니까.
그래서 그럴듯한 거짓 규정을 지어낸다(환각).
사람도 똑같다. 정보가 없으면 헛소리를 한다.
그럼 어떻게 할까? 답하기 전에 규정 문서를 찾아서 같이 던져 주면 된다.
# 아래 예제는 핵심 흐름만 짧게 보여 줍니다.
# 답하기 전에 관련 자료를 먼저 찾아 붙임
docs = search("환불 규정") # ① 자료 검색
model.ask("환불 규정 알려줘", docs) # ② 자료 보고 답
이렇게 "찾아서 붙여 주는" 방식이 RAG다.
여기서 한 발 더 나가면, 검색만 하는 게 아니라 계산도 하고 메일도 보내는 비서가 된다.
그게 에이전트다.
이 장은 이 둘 이야기다.
이 장에서 딱 4가지만
- RAG — 답하기 전에 관련 자료를 찾아 붙여 준다. 모델이 모르는 걸 알게 만든다.
- 검색의 두 방식 — 단어가 똑같은 걸 찾기(빠름) vs 뜻이 비슷한 걸 찾기(똑똑함).
- 에이전트 — 모델에 도구(손발)를 달아 스스로 행동하게 한다.
- 메모리 — 방금 들은 것(단기)과 오래된 자료(장기)를 나눠서 기억한다.
학습 목표
- RAG가 왜 필요한지 설명한다.
- 단어 기반 검색과 의미 기반 검색을 구분한다.
- 에이전트가 그냥 챗봇과 어떻게 다른지 설명한다.
- 단기 메모리와 장기 메모리를 구분한다.
개념 1 — RAG: 답하기 전에 자료를 찾아 붙인다
망가지는 장면
"신제품 A300 프린터 사양을 물었더니, AI가 없는 숫자를 술술 지어냈다."
모델은 그 제품을 학습한 적이 없다. 그래서 환각이 났다.
일상비유
오픈북 시험.
머리로만 답하면 틀린다.
답안지 옆에 자료집을 펴 놓고 찾아보며 쓰면 정답률이 확 오른다.
RAG는 모델에게 자료집을 펴 주는 일이다.
| 비유 | 코드 | 위험 |
|---|---|---|
| 머리로만 답함(폐쇄책 시험) | model.ask("A300 사양?") |
모르면 지어냄(환각) |
| 자료 펴 놓고 답함(오픈북) | model.ask("A300 사양?", docs) |
자료를 잘못 찾으면 헛답 |
한 문장 정의 — RAG는 질문마다 관련 자료를 찾아 컨텍스트에 붙여 주는 방식이며, 모델을 고치지 않고도 모르는 것을 알게 만든다.
왜 굳이? — "그냥 다 넣으면 안 되나?"
요즘 모델은 긴 글도 받는다.
그럼 자료를 전부 넣으면 되지 않나?
안 된다. 두 가지 이유다.
- 자료는 계속 늘어난다. 아무리 길게 받아도 언젠간 넘친다.
- 길게 넣을수록 모델이 엉뚱한 데를 본다. 게다가 길면 비용도 시간도 더 든다.
RAG는 꼭 필요한 자료만 골라 넣어서, 싸고 빠르고 정확하게 만든다.
한 걸음 더 ▸ (지금 몰라도 됨)
Anthropic은 "자료가 약 500쪽(20만 토큰) 미만이면 RAG 없이 그냥 다 넣어도 된다"고 했다.
즉 자료가 적으면 RAG가 굳이 필요 없다. 많아질 때 빛난다. 지금은 "많으면 골라 넣는다"만 기억하면 된다.
예시 폭격
예시 1 (완성예) — 고객 지원 챗봇.
질문 "비밀번호 어떻게 바꿔요?" → 매뉴얼에서 비밀번호 관련 쪽을 찾아 붙임 → 정확히 답.
# 질문과 가까운 문서 조각을 찾아오는 검색 단계를 실행합니다.
docs = search("비밀번호 변경")
# 준비한 함수나 객체를 호출해 예제의 핵심 동작을 실행합니다.
model.ask("비밀번호 어떻게 바꿔요?", docs)
예시 2 (부분완성) — 빈칸을 채워 보자.
법률 상담 봇이 판례를 지어내지 않게 하려면?
docs = search("____") # 빈칸: 무엇을 검색할까? → 질문 속 사건명
# 준비한 함수나 객체를 호출해 예제의 핵심 동작을 실행합니다.
model.ask("이 사건 판례 있어?", docs)
답: 질문에 나온 사건 키워드를 검색한다. 그래야 진짜 판례만 붙는다.
예시 3 (독립적용) — 직접 떠올려 보자.
"우리 팀 회의록에서 지난주 결정사항 알려줘"라는 질문에 RAG를 쓰면, 무엇을 search 하고 무엇을 붙여 줄까?
(힌트: 회의록 문서를 검색해 관련 청크를 붙인다.)
개념 2 — 검색의 두 방식: 단어가 같은가, 뜻이 비슷한가
망가지는 장면
"'트랜스포머 아키텍처'를 검색했더니 영화 '트랜스포머'랑 전기 변압기 문서가 나왔다."
단어만 같으면 다 끌어왔기 때문이다.
일상비유
도서관에서 책 찾기.
방법 A — 제목에 그 단어가 있는 책만 뽑기. 빠르지만 멍청하다.
방법 B — 사서에게 "이런 내용"이라 말하면 뜻이 맞는 책을 골라 줌. 똑똑하지만 느리다.
| 비유 | 코드 | 위험 |
|---|---|---|
| 단어 똑같은 것만(방법 A) | find_word("트랜스포머") |
뜻 다른 게 섞임(변압기·영화) |
| 뜻이 비슷한 것(방법 B) | find_meaning("AI 신경망 구조") |
느리고 비쌈 |
한 문장 정의 — 단어 기반 검색은 글자 모양이 같은 걸 찾고(빠름·저렴), 의미 기반 검색은 임베딩으로 뜻이 가까운 걸 찾는다(똑똑함·비쌈).
(임베딩이 헷갈리면 0장 용어집 "임베딩" 칸을 보면 된다. 뜻을 좌표로 바꿔 가까운 걸 찾는 것이다.)
단순 규칙
처음엔 단어 기반(BM25)부터 써라. 빠르고 공짜에 가깝고, 그냥 잘 된다.
이걸 기준선으로 삼고, 부족하면 의미 기반을 얹는다.
한 걸음 더 ▸ (지금 몰라도 됨)
실제 현장은 둘을 섞는다(하이브리드 검색).
단어 기반으로 후보를 싹 긁고, 그 안에서 의미 기반으로 진짜 맞는 걸 다시 고른다(재순위화).
지금은 "단어부터, 부족하면 의미 추가"만 알면 된다.
예시 폭격
예시 1 (완성예, before/after) — 오류 코드 검색.
before: 의미 기반만 쓰니 EADDRNOTAVAIL(99) 코드가 뭉개져서 안 찾힘.
after: 단어 기반을 같이 쓰니 코드를 글자 그대로 정확히 찾음.
예시 2 (부분완성) — 어느 방식이 맞을까?
# 아래 예제는 핵심 흐름만 짧게 보여 줍니다.
# 질문: "트랜스포머 아키텍처 설명한 자료"
# → 단어가 같아도 뜻이 다른 게 많음 → ____ 기반 검색이 유리
답: 의미 기반. 뜻으로 골라야 영화·변압기를 걸러낸다.
예시 3 (독립적용) — 직접 골라 보자.
"제품 코드 SKU-7782 들어간 주문"을 찾는다면, 단어 기반과 의미 기반 중 어느 쪽이 나을까? 왜?
(힌트: 정확한 코드 글자 매칭이 필요하다.)
개념 3 — 에이전트: 모델에 손발을 달아 준다
망가지는 장면
"AI한테 199999 나누기 292를 물었더니 틀린 답을 자신만만하게 내놨다."
모델은 글을 잇는 기계지, 계산기가 아니다(0장 척추 1).
일상비유
손 없는 천재 vs 비서.
천재가 암산은 잘하는데 손이 없어 메일도 못 보내고 계산기도 못 누른다.
여기에 연장통(도구)을 쥐여 주면, 검색하고 계산하고 메일까지 보내는 비서가 된다.
그게 에이전트다.
| 비유 | 코드 | 위험 |
|---|---|---|
| 그냥 답만 함(챗봇) | model.ask("40파운드는 몇 kg?") |
수학·최신정보에 약함 |
| 도구 쥐고 행동함(에이전트) | agent.run(...) → 계산기 호출 |
도구 잘못 쓰면 사고 |
한 문장 정의 — 에이전트는 환경을 살펴보고(읽기) 도구로 행동까지(쓰기) 하는 AI이며, 어떤 환경에서 어떤 도구를 쥐느냐로 정해진다.
도구는 크게 세 종류
- 자료 가져오기 — 검색기, 웹 브라우징, 사내 DB. 모르는 걸 알게 함.
- 약점 메우기 — 계산기, 번역기, 코드 실행기. 모델이 못하는 걸 대신함.
- 행동하기(쓰기) — 메일 보내기, DB 수정, 송금. 진짜 세상을 바꿈.
단순 규칙
도구가 많을수록 능력은 커진다. 하지만 너무 많으면 오히려 헷갈려 한다.
그래서 꼭 필요한 도구만 신중히 골라 쥐여 준다.
특히 "행동하기" 도구는 조심해야 한다.
한 걸음 더 ▸ (지금 몰라도 됨)
왜 조심? 인턴에게 회사 DB 삭제 권한을 안 주는 것과 같다.
믿을 수 없는 AI에 송금 권한을 주면, 한 번 헛돌 때 피해가 크다.
그래서 위험한 행동은 사람이 먼저 승인하게 만든다. 지금은 "쓰기 도구는 위험, 승인 필요"만 알면 된다.
작은 사고가 쌓이면 큰 사고
에이전트는 여러 단계를 거친다.
한 단계 정확도가 95%여도, 10단계면 약 60%, 100단계면 0.6%로 무너진다.
그래서 단계를 줄이고, 더 똑똑한 모델을 쓰고, 중간중간 스스로 점검(성찰)하게 한다.
예시 폭격
예시 1 (완성예) — 단위 변환.
"40파운드는 몇 kg?" → 모델이 직접 계산하면 틀릴 수 있음 → 계산기 도구 호출 → 정확.
# 아래 예제는 핵심 흐름만 짧게 보여 줍니다.
# 모델이 "이건 계산기로!"라고 판단해 도구를 부름
agent.run("40파운드는 몇 kg?") # → lbs_to_kg(40) 호출
예시 2 (부분완성) — 어떤 도구가 필요할까?
# 아래 예제는 핵심 흐름만 짧게 보여 줍니다.
# "오늘 서울 날씨 알려줘"
# 모델 학습은 과거에 멈춤 → 오늘 날씨를 모름 → ____ 도구 필요
답: 웹 검색(자료 가져오기) 도구. 최신 정보는 검색해야 안다.
예시 3 (독립적용) — 직접 분류해 보자.
"이 고객에게 사과 메일 보내줘"는 세 도구 종류 중 무엇일까? 왜 조심해야 할까?
(힌트: 진짜로 메일이 나가는 "행동하기" 도구다.)
개념 4 — 메모리: 방금 들은 것과 오래된 것을 나눈다
망가지는 장면
"AI 비서한테 매번 내 이름과 취향을 처음부터 다시 설명해야 한다. 어제 말한 걸 다 까먹는다."
기억할 곳이 없으면 비서는 쓸모가 없다.
일상비유
사람의 기억.
- 숨 쉬는 법은 안 잊는다 → 몸에 밴 지식.
- 방금 만난 사람 이름은 잠깐만 기억 → 단기 기억.
- 오래된 자료는 책·메모장에 적어 둠 → 장기 기억(필요할 때 꺼내 봄).
AI 메모리도 똑같이 셋으로 나뉜다.
| 비유 | 코드 | 위험 |
|---|---|---|
| 몸에 밴 지식(안 잊음) | model.weights |
바꾸려면 재학습 필요 |
| 방금 들은 것(잠깐) | context = 최근 대화 |
자리가 꽉 차면 밀려남 |
| 메모장에 적어 둠(꺼내 봄) | long_term = search(과거기록) |
검색 잘못하면 못 꺼냄 |
한 문장 정의 — AI 메모리는 모델에 밴 내부 지식, 지금 대화만 담는 단기 메모리, 외부에 적어 두고 찾아 쓰는 장기 메모리로 나뉜다.
단순 규칙
지금 작업에 바로 필요한 건 단기에.
가끔 필요한 오래된 건 장기에 적어 두고 꺼내 쓴다.
장기 메모리는 사실 RAG와 똑같다. 외부에 두고 검색해 오니까.
한 걸음 더 ▸ (지금 몰라도 됨)
단기 메모리는 자리가 좁아서 꽉 차면 뭔가 버려야 한다.
가장 단순한 방법은 오래된 것부터 버리기(FIFO). 하지만 첫 메시지에 중요한 목적이 있으면 낭패다.
더 똑똑한 방법은 대화를 요약해 압축하는 것. 지금은 "단기는 좁다, 넘치면 장기로"만 알면 된다.
예시 폭격
예시 1 (완성예) — 책 추천 비서.
사용자가 전에 '삼체'를 좋아했다고 장기 메모리에 적어 둠 → 다음에 비슷한 SF를 추천.
예시 2 (부분완성) — 어디에 저장할까?
# 아래 예제는 핵심 흐름만 짧게 보여 줍니다.
# "방금 사용자가 말한 배송 주소" → 지금 작업에만 필요 → ____ 메모리
답: 단기 메모리. 이번 주문이 끝나면 굳이 안 들고 있어도 된다.
예시 3 (독립적용) — 직접 나눠 보자.
"이 사용자는 채식주의자"라는 정보는 단기와 장기 중 어디에 둘까? 왜?
(힌트: 다음에 또 만나도 기억해야 하는 정보다.)
정리
자료를 찾아 붙이면 모델이 모르는 걸 알게 된다(RAG).
검색은 단어가 같은 걸 빠르게 찾거나, 뜻이 가까운 걸 똑똑하게 찾는다.
모델에 도구를 쥐여 주면 스스로 행동하는 에이전트가 되고, 기억할 곳을 나눠 주면 더 똑똑해진다.
세 가지 공통점: 모델 자체는 안 고치고, 입력만 잘 챙겨서 능력을 키운다.
더 해보기
- RAG·에이전트는 변화가 가장 빠른 분야다 (검증 2026-05-21): 에이전트 설계 패턴 공식 가이드 Building Effective Agents (Anthropic).
다음 7장 예고 — 지금까지는 모델을 안 고치고 입력만 챙겼다. 다음엔 모델 자체를 우리 데이터로 조금 더 가르치는 법(파인튜닝)을 본다. (지금 몰라도 됩니다.)
연습문제
- 설명.
자료 찾아 붙이고 스스로 일하기의 핵심을 처음 듣는 사람에게 한 문장으로 설명하라. - 구분. 두 개념(
RAG,에이전트)을 실제 예시 하나로 구분하라. - 적용. 내 프로젝트나 학습 노트에서 이 장의 개념을 적용해 작게 개선할 지점을 하나 고르라.
부록 A. 쉬운 용어 사전
| 용어 | 아주 쉬운 뜻 | 이 장에서 나온 위치 |
|---|---|---|
| RAG | 답변할 때 관련 자료를 찾아 붙여 모델이 근거를 보고 답하게 하는 방식. | 부록 B와 본문 예시 |
| 에이전트 | 모델이 도구를 고르고 여러 단계를 진행하게 만든 구조. | 부록 B와 본문 예시 |
| 짧은 기억 | 현재 대화 안에서만 잠시 유지되는 정보. | 부록 B와 본문 예시 |
| 긴 기억 | 나중에도 다시 쓰기 위해 저장하는 정보. | 부록 B와 본문 예시 |
부록 B. 헷갈리는 개념 비교표
| A | B | 구분 포인트 |
|---|---|---|
| RAG | 에이전트 | RAG는 자료를 찾아 붙이고, 에이전트는 도구 사용과 반복 판단까지 한다. |
| 짧은 기억 | 긴 기억 | 짧은 기억은 현재 대화, 긴 기억은 나중에도 다시 쓸 정보다. |
부록 C. 더 읽을 자료
- 이 장의
더 해보기섹션 — 이미 모아 둔 공식 문서나 실습 링크가 있으면 여기서 먼저 확인한다. - 같은 책의
0장 한눈에 보기— 용어가 막히면 0장의 용어집과 개념 척추로 돌아간다. - 원본 딥다이브판 같은 장 — 입문판을 읽고 큰 흐름이 잡힌 뒤 세부 논리를 더 깊게 확인한다.
- 이 장의
flashcards.json— 읽은 직후 질문만 보고 답을 떠올리는 회상 연습에 쓴다.
부록 D. 연습문제 풀이
- 설명 예시.
자료 찾아 붙이고 스스로 일하기는 거대 모델을 제품에 넣을 때 어떤 선택을 하고 어떻게 확인할지 판단하게 해 주는 장이다. 중요한 것은 용어를 외우는 것이 아니라, 이 개념이 어떤 입력·부품·결정에 영향을 주는지 말로 풀어 보는 것이다. - 구분 예시. 두 개념(
RAG,에이전트)의 차이는 이렇게 잡으면 된다. RAG는 자료를 찾아 붙이고, 에이전트는 도구 사용과 반복 판단까지 한다. 실제 사례를 볼 때는 목적, 입력, 실패했을 때의 증상을 따로 적어 보면 헷갈리지 않는다. - 적용 예시. 가장 작은 개선부터 고른다. 예를 들어 이름을 더 분명히 하거나, 평가 기준을 한 줄 추가하거나, 직접 알 필요 없는 내부 정보를 감추는 식으로 시작한다. 한 번에 크게 갈아엎는 것보다 작은 변경 하나를 확인하며 진행하는 쪽이 입문 단계에 맞다.
클릭하거나 Space를 눌러 뒤집기